package com.example.common.grpc;

import com.example.game.proto.internal.SrvReq;
import com.example.game.proto.internal.SrvResp;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * gRPC消息构建器
 * 用于构建SrvReq和SrvResp消息
 * 
 * @author: Allen
 * @create: 2025/7/3 21:48
 * @description: gRPC消息构建工具类
 **/
@Slf4j
public class GrpcMessageBuilder {
    
    private static final AtomicInteger messageIdGenerator = new AtomicInteger(1);
    
    /**
     * 构建服务请求消息
     * 
     * @param sid 服务器ID
     * @param code 协议号
     * @param userId 用户ID
     * @param data 消息体数据
     * @return SrvReq消息对象
     */
    public static SrvReq buildSrvReq(int sid, int code, int userId, byte[] data) {
        try {
            int messageId = messageIdGenerator.getAndIncrement();
            int bodyLen = data != null ? data.length : 0;
            
            SrvReq.Builder builder = SrvReq.newBuilder()
                    .setId(messageId)
                    .setCode(code)
                    .setSid(sid)
                    .setUserId(userId);

            if (data != null && data.length > 0) {
                builder.setBody(com.google.protobuf.ByteString.copyFrom(data));
            }
            
            SrvReq request = builder.build();
            log.debug("构建SrvReq消息: id={}, code={}, sid={}, userId={}, bodyLen={}", 
                    messageId, code, sid, userId, bodyLen);
            
            return request;
        } catch (Exception e) {
            log.error("构建SrvReq消息失败: sid={}, code={}, userId={}", sid, code, userId, e);
            throw new RuntimeException("构建SrvReq消息失败", e);
        }
    }
    
    /**
     * 构建服务响应消息
     * 
     * @param sid 服务器ID
     * @param code 协议号
     * @param userId 用户ID
     * @param ret 返回码（0表示成功，非0表示错误）
     * @param data 响应数据
     * @return SrvResp消息对象
     */
    public static SrvResp buildSrvResp(int sid, int code, int userId, int ret, byte[] data) {
        try {
            int messageId = messageIdGenerator.getAndIncrement();
            int bodyLen = data != null ? data.length : 0;
            
            SrvResp.Builder builder = SrvResp.newBuilder()
                    .setId(messageId)
                    .setCode(code)
                    .setSid(sid)
                    .setRet(ret);

            if (data != null && data.length > 0) {
                builder.setBody(com.google.protobuf.ByteString.copyFrom(data));
            }
            
            SrvResp response = builder.build();
            log.debug("构建SrvResp消息: id={}, code={}, sid={}, userId={}, ret={}, bodyLen={}", 
                    messageId, code, sid, userId, ret, bodyLen);
            
            return response;
        } catch (Exception e) {
            log.error("构建SrvResp消息失败: sid={}, code={}, userId={}, ret={}", sid, code, userId, ret, e);
            throw new RuntimeException("构建SrvResp消息失败", e);
        }
    }
    
    /**
     * 构建成功响应消息
     * 
     * @param sid 服务器ID
     * @param code 协议号
     * @param userId 用户ID
     * @param data 响应数据
     * @return SrvResp消息对象
     */
    public static SrvResp buildSuccessResp(int sid, int code, int userId, byte[] data) {
        return buildSrvResp(sid, code, userId, 0, data);
    }
    public static SrvResp buildSuccessResp(int sid, int code, int userId) {
        return buildSrvResp(sid, code, userId, 0, null);
    }

    public static SrvResp buildSuccessResp(int sid, int code) {
        return buildSrvResp(sid, code, 0, 0, null);
    }
    
    /**
     * 构建错误响应消息
     * 
     * @param sid 服务器ID
     * @param code 协议号
     * @param userId 用户ID
     * @param errorCode 错误码
     * @param errorMessage 错误信息
     * @return SrvResp消息对象
     */
    public static SrvResp buildErrorResp(int sid, int code, int userId, int errorCode, String errorMessage) {
        byte[] errorData = errorMessage != null ? errorMessage.getBytes() : new byte[0];
        return buildSrvResp(sid, code, userId, errorCode, errorData);
    }
    

    
    /**
     * 从SrvReq创建对应的SrvResp
     * 
     * @param request 请求消息
     * @param ret 返回码
     * @param data 响应数据
     * @return SrvResp消息对象
     */
    public static SrvResp buildRespFromReq(SrvReq request, int ret, byte[] data) {
        return buildSrvResp(request.getSid(), request.getCode(), request.getUserId(), ret, data);
    }
    
    /**
     * 从SrvReq创建成功响应
     * 
     * @param request 请求消息
     * @param data 响应数据
     * @return SrvResp消息对象
     */
    public static SrvResp buildSuccessRespFromReq(SrvReq request, byte[] data) {
        return buildRespFromReq(request, 0, data);
    }
    
    /**
     * 从SrvReq创建错误响应
     * 
     * @param request 请求消息
     * @param errorCode 错误码
     * @param errorMessage 错误信息
     * @return SrvResp消息对象
     */
    public static SrvResp buildErrorRespFromReq(SrvReq request, int errorCode, String errorMessage) {
        return buildRespFromReq(request, errorCode, errorMessage.getBytes());
    }
    
    /**
     * 重置消息ID生成器
     * 主要用于测试或重置场景
     */
    public static void resetMessageId() {
        messageIdGenerator.set(1);
    }
    
    /**
     * 获取当前消息ID
     * 
     * @return 当前消息ID
     */
    public static int getCurrentMessageId() {
        return messageIdGenerator.get();
    }
}
